/* 
Dart 中的抽象类:Dart抽象类主要用于定义标准，子类可以继承抽象类，也可以实现抽象类接口
1. 抽象类通过 abstract 关键字来定义
2. Dart 中的抽象方法不能用 abstract 声明， Dart 中没有方法体的方法我们称为抽象方法
3. 如果子类继承抽象类必须要实现里面的抽象方法
4. 如果把抽象类当作接口实现的话必须要实现抽象类里面定义的所有属性和方法
5. 抽象类不能被实例化，只有继承他的子类可以

extends 抽象类 和 implements 的区别：
1、如果要复用抽象类里面的方法，并且要用抽象方法约束子类的话，使用 extends 继承抽象类
2、如果只把抽象类当作标准就用 implements 事项抽象类
 */
// 案例定义一个 Animal 类 要求他的子类必须包含 eat 方法

/* 抽象类 */
abstract class Animal {
  eat(); // 抽象方法
  run(); // 抽象方法
  // 抽象类中的方法
  printInfo() {
    print('抽象类中的方法');
  }
}

// 在子类中 抽象方法必须全部实现
class Dog extends Animal {
  @override
  eat() {
    print('🐕吃骨头');
  }

  @override
  run() {
    print('🐕在跑');
  }
}

class Cat extends Animal {
  @override
  eat() {
    print('🐱吃🐟');
  }

  @override
  run() {
    print('🐱在逃');
  }
}

void main() {
  Dog d = new Dog();
  d.eat();
  d.run();
  d.printInfo();

  Cat c = new Cat();
  c.eat();

  // 抽象类无法直接进行实例化
  // Animal a = new Animal();
}
